home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / pctchnqs / 1991 / number2 / mediabyt.c < prev    next >
C/C++ Source or Header  |  1991-03-13  |  2KB  |  51 lines

  1. /*
  2.  * MEDIABYT.C This is a program to determine what size diskette is in drive
  3.  * A: by reading the media byte in the FAT via DOS Interrupt 21h Function 1Ch.
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <dos.h>
  8.  
  9. main()
  10. {
  11.     unsigned char far *fpMediaID;       /* Far pointer to media byte. */
  12.     union REGS sRegs;                   /* Declare registers. */
  13.     struct SREGS sSregs;                /* Declare segment registers. */
  14.  
  15.     sRegs.h.ah = 0x1C;                  /* Set function to get drive data. */
  16.     sRegs.h.dl = 1;                     /* Set drive id; 0=default, 1=A, etc. */
  17.     intdosx(&sRegs, &sRegs, &sSregs);   /* Execute DOS interrupt. */
  18.  
  19.     if (sRegs.h.al == 0xFF)
  20.     {
  21.     printf( "Invalid drive or critical error.");
  22.     exit(2);
  23.     }
  24.  
  25. /* Turn off checks for out of range pointers. (QuickC) */
  26. #pragma check_pointer (off)
  27.  
  28. /* Pick up segment:offset address of media byte */
  29.     fpMediaID = (unsigned char far *)
  30.     ((((long)sSregs.ds) << 16) | sRegs.x.bx);
  31.  
  32.     printf( "\nMedia byte = %X\n", *fpMediaID);   /* Print media byte. */
  33.     /* The media ID byte has the following meaning:
  34.      *  0xF0    3.5"    double-sided, 18 sectors - 1.44M
  35.      *                  or "other"
  36.      *  0xF8    fixed disk
  37.      *  0xF9    5.25"   double-sided, 15 sectors - 1.2M (AL = 1)
  38.      *          or 3.5" double-sided,  9 sectors - 720K (AL = 2)
  39.      *  0xFC    5.25"   single-sided,  9 sectors - 180K
  40.      *  0xFD    5.25"   double-sided,  9 sectors - 360K
  41.      *  0xFE    5.25"   single-sided,  8 sectors - 160K
  42.      *  0xFF    5.25"   double-sided,  8 sectors - 320K
  43.      */
  44. #pragma check_pointer (on)
  45.  
  46.     printf ("Capacity = %ld bytes\n",
  47.         (long)sRegs.x.cx*sRegs.h.al*sRegs.x.dx);
  48.  
  49.     return (0);
  50. }
  51.